package com.itheima.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.mapper.ClazzMapper;
import com.itheima.mapper.StudentMapper;
import com.itheima.pojo.Clazz;
import com.itheima.pojo.Emp;
import com.itheima.pojo.PageResult;
import com.itheima.pojo.Student;
import com.itheima.service.ClazzService;
import com.itheima.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class ClazzServiceImpl extends ServiceImpl<ClazzMapper, Clazz> implements ClazzService {
     @Autowired
     private EmpService empService;
     @Autowired
     private StudentMapper studentMapper;
    /**
     * 分页查询
     */
    @Override
    public PageResult<Clazz> list(String name, LocalDate begin, LocalDate end, int page, int pageSize) {
        Page<Clazz> pageInfo = Page.of(page, pageSize);

        // 根据最后修改时间倒序排序
        pageInfo.addOrder(OrderItem.desc("update_time"));
        // 使用lambdaQuery方法构建查询条件
        pageInfo = lambdaQuery().like(name != null && !name.isEmpty(), Clazz::getName, name)
                .between(begin != null && end != null, Clazz::getBeginDate, begin, end)
                .page(pageInfo);
        // 获取班级集合
        List<Clazz> clazzList = pageInfo.getRecords();

        // 获取所有班级的班主任ID
        List<Integer> masterIds = clazzList.stream().map(clazz -> clazz.getMasterId()).collect(Collectors.toList());
        if (!masterIds.isEmpty()) {
            // 批量查询这些班主任的信息
            List<Emp> masters = empService.listByIds(masterIds);

            // 将班主任名称封装到班级对象中
           clazzList.forEach(clazz -> {
               masters.forEach(emp -> {
                   if (clazz.getMasterId() != null &&clazz.getMasterId().equals(emp.getId())){
                       clazz.setMasterName(emp.getName());
                   }
                   // 根据班级开课时间和结课时间设置班级的状态
                   if (clazz.getBeginDate() != null && clazz.getBeginDate().isAfter(LocalDate.now())) {
                       clazz.setStatus("未开班");
                   } else if (clazz.getEndDate() != null && clazz.getEndDate().isBefore(LocalDate.now())) {
                       clazz.setStatus("已结课");
                   }else {
                       clazz.setStatus("在读");
                   }
               });
           });
        }
        // 封装结果并返回
        return new PageResult<>(pageInfo.getTotal(), clazzList);
    }

    /**
     * 删除班级
     *
     * @param id
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void removeClazz(Integer id) {
        //如果班级下关联的有学生, 则不允许删除该班级, 并提示错误信息 : "对不起, 该班级下有学生, 不能直接删除"。
        if (studentMapper.selectCount(new LambdaQueryWrapper<Student>().eq(Student::getClazzId, id)) > 0) {
            // 注意：这里使用了日志记录错误信息，实际项目中应该抛出异常或返回错误码
            log.error("对不起, 该班级下有学生, 不能直接删除");
            return;
        }
        // 删除班级
        removeById(id);
    }
}